今天就進入到Web的2顆星的題目了,其實2顆星的題目只是沒有那麼直覺,在做的時候多想一下或是有什麼工具可以實現唷~
點進去出現了一個影片其他什麼也沒有,依上面的訊息來看應該是在第二個按鈕出了錯誤
提示說這兩個按鈕有什麼不同,就直接開F12看程式碼,第一個按鈕是以POST的方式發出請求的,但第二個沒有說他是POST,點開Network的欄位點進第二個按鈕,發現他是利用GET的方式
這時我們可以利用工具將請求重新以POST的方式,不過這邊我採用Linux指令的方式curl
這個指令他可以利用HTTP的方式存取網路上的資源
curl -X 後面可以接要發出的請「(GET/POST/...等等) 要發出請求的網址
$ curl -X POST http://2018shell.picoctf.com:21579/button2.php
Well done, your flag is: picoCTF{button_button_whose_got_the_button_ed306c10}
這邊就可以以POST的方式向網站發出請求囉~
又是一題要我們登入的題目,不過他這邊提供了php source code我們就來看看吧
<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');
include "config.php";
$con = new SQLite3($database_file);
$username = $_POST["username"];
$password = $_POST["password"];
$debug = $_POST["debug"];
$query = "SELECT 1 FROM users WHERE name='$username' AND password='$password'";
if (intval($debug)) {
echo "<pre>";
echo "username: ", htmlspecialchars($username), "\n";
echo "password: ", htmlspecialchars($password), "\n";
echo "SQL query: ", htmlspecialchars($query), "\n";
echo "</pre>";
}
//validation check
$pattern ="/.*['\"].*OR.*/i";
$user_match = preg_match($pattern, $username);
$password_match = preg_match($pattern, $username);
if($user_match + $password_match > 0) {
echo "<h1>SQLi detected.</h1>";
}
else {
$result = $con->query($query);
$row = $result->fetchArray();
if ($row) {
echo "<h1>Logged in!</h1>";
echo "<p>Your flag is: $FLAG</p>";
} else {
echo "<h1>Login failed.</h1>";
}
}
?>
有沒有注意到23.24行,他比對的內容只有針對username並沒有針對password的部份,所以我們可以對密碼欄位進行SQLinjection,不過以往我們利用註解繞過後面判斷密碼的方式進行,但是這時要對密碼進行injection要知道帳號是多少,但是這邊看起來沒有什麼頭緒
不過突然想到可以利用SQL語法中的AND,讓後面變成True就可以拿到FLag了SELECT 1 FROM users WHERE name='$username' AND password='$password'
我們隨便輸入帳號,密碼我們可以輸入' or 1=1 --
就可以成功拿到Flag囉
這邊也有另一個方法
在user的欄位輸入: '/*
密碼的欄位輸入: */ or 1=1 --
Query的語句會變成 SELECT 1 FROM users WHERE name=''/*' AND password='*/ or 1=1 --'
這裡可以看到判斷密碼已經被我們註解掉,就可以順利取得Flag囉~
對php不熟一開始看還有點吃力,不過還好這題的漏洞算是蠻直覺的,不過沒有仔細看還真沒看出來呢,原來打CTF細心也是非常重要的啊!